package Day019_Junit单元测试_NIO.demo4_Channel接口_通道;

/**
 * @author zhangyan
 * @date 2020/5/12 14:01
 */
/*
    上例直接使用FileChannel结合ByteBuffer实现的管道读写，但并不能提高文件的读写效率
    ByteBuffer有个子类：MappedByteBuffer，它可以创建一个“直接缓冲区”，并可以将文件直接映射至内存，可以提高大文件的读写效率


    MappedByteBuffer(抽象类)
            调用FileChannel的map()方法获取一个MappedByteBuffer，默认大小2GB
    map()方法的原型：
            MappedByteBuffer map(MapMode mode, long position, long size);
            说明：将节点中从position开始的size个字节映射到返回的MappedByteBuffer中
                 MapMode:用来指定读或者写的模式

    map()方法的第一个参数mode：映射的三种模式，在这三种模式下得到的将是三种不同的MappedByteBuffer：
    三种模式都是Channel的内部类MapMode中定义的静态常量
    1). RandomAccessFile.MapMode.READ_ONLY：得到的镜像只能读不能写（只能使用get之类的读取Buffer中的内容）；
    2). RandomAccessFile.MapMode.READ_WRITE：得到的镜像可读可写（既然可写了必然可读），对其写会直接更改到存储节点；
    3). RandomAccessFile.MapMode.PRIVATE：得到一个私有的镜像，其实就是一个(position, size)区域的副本罢了，
        也是可读可写，只不过写不会影响到存储节点，就是一个普通的ByteBuffer了！！

    为什么使用RandomAccessFile？
    1). 使用InputStream获得的Channel可以映射，使用map时只能指定为READ_ONLY模式，不能指定为READ_WRITE和PRIVATE，否则会抛出运行时异常！
    2). 使用OutputStream得到的Channel不可以映射！并且OutputStream的Channel也只能write不能read！
    3). 只有RandomAccessFile获取的Channel才能开启任意的这三种模式！

 */

public class Test3_MappedByteBuffer类 {
    public static void main(String[] args) {

    }
}
